/**
 * 用法一：在子类的构造方法第一行，必须显示地使用super()调用父类构造方法。
 * 用法二：如果子类重写了父类的方法（或覆盖了父类的属性），那么可以使用super.父类方法()访问被覆盖了的父类方法
 * 
 * 注意：super只能在子类内部中使用，指向当前实例父类的引用
 */

// 子类的构造方法
class Parent {

    constructor(name) {
        this.name = name;
    }

    sayHello() {
        console.log("爸爸说：“你好！”")
    }

    findSon() {
        this.play();
    }

    play() {
        console.log("爸爸,去玩了！");
    }

}

class Son extends Parent {

    constructor(name,type) {
        // 子类构造方法的第一行代码，必须调用父类的构造方法
        // 使用super()调用
        super(name);
        this.type = type;
    }

    sayHello() {      
        console.log("儿子说：“你好！”")
    }

    play() {
        console.log("儿子去玩了");
    }

    findParent() {
        this.findSon();
    }

    sayParentHello() {
        // 调用被子类覆盖了的父类方法
        super.sayHello();
    }
}

let son = new Son("测试1","机器人");
console.log("son.name = ",son.name);
son.sayHello();
son.sayParentHello();

// 额外扩展：
son.findParent();
